package com.snsoft.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.snsoft.bean.User;
import com.snsoft.exception.UserNotFoundException;
import com.snsoft.util.Constants;
import com.snsoft.util.JdbcUtils;

/**
 * 
 * @author 慎伟康
 * 
 * @date 2017年10月21日 下午7:23:12
 * 
 * @Description TODO
 *     user模块dao
 */
@Repository  //声明为持久层
public class UserDao {
	
	@Autowired  //自动装配一个JdbcTemplate，可供方法调用。
	private JdbcTemplate jdbcTemplate;
	
	@Autowired  //自动装配一个QueryRunner，可供方法调用。
	private QueryRunner queryRunner;

	/**
	 * 根据账号获取用户
	 * 
	 * @param userCode
	 * @return User
	 * @throws SQLException
	 * @throws UserNotFoundException 
	 */
	public User getUser(String userCode) throws SQLException, UserNotFoundException {
		String sql = "select * from users where userCode = ? and deleteFlag = '1'";
		
		//可自动将一行数据映射到指定类的实例中，它首先将这个类实例化，然后通过名称匹配的方式，映射到属性中去。
//		RowMapper<User> rm = BeanPropertyRowMapper.newInstance(User.class);
//		try {
//			return jdbcTemplate.queryForObject(sql, new Object[]{ userCode }, rm);
//		} catch (EmptyResultDataAccessException e) {
//			throw new UserNotFoundException(Constants.MSG_SERVICE_USERNOTFOUND + "userCode=" + userCode);
//		}
		
		return queryRunner.query(sql, new BeanHandler<User>(User.class), new Object[] { userCode });
	}

	/**
	 * 根据id获取用户
	 * 
	 * @param userID
	 * @return User
	 * @throws SQLException 
	 * @throws UserNotFoundException 
	 */
	public User getUser(int userID) throws SQLException, UserNotFoundException {
		String sql = "select * from users where userID = ? and deleteFlag = '1'";
		
		//可自动将一行数据映射到指定类的实例中，它首先将这个类实例化，然后通过名称匹配的方式，映射到属性中去。
		RowMapper<User> rm = BeanPropertyRowMapper.newInstance(User.class);
		try {
			/*
			 * 这个方法并不抛出这个异常，这里主动捕获，转化为自定义异常，业务层就可以不判空，相当于业务层判空代码转移到这里。
			 * 业务层方法调用本方法，可以不判空，直接进行业务处理，只需抛出UserNotFoundException异常即可。
			 * JdbcTemplate把SQLException封装了，可以针对性地在dao层处理转化。
			 */
			return jdbcTemplate.queryForObject(sql, new Object[]{ userID }, rm);
		} catch (EmptyResultDataAccessException e) {
			throw new UserNotFoundException(Constants.MSG_SERVICE_USERNOTFOUND + "userID=" + userID);
		}
	}
	
	/**
	 * 用户修改密码
	 * 
	 * @param userID
	 * @param password
	 * @throws SQLException
	 */
	public void updatePassword(int userID, String password) throws SQLException{
		String sql = "update users set userPassWord = ? where userID = ?";
//		queryRunner.update(sql, new Object[]{password, userID});
		jdbcTemplate.update(sql, new Object[] { password, userID });
	}
	
	/**
	 * 根据账号获取用户
	 * 以JDBC方式实现
	 */
	public HashMap<String, Object> getUserDemo1(String userCode) throws SQLException {
		String sql = "select * from users where userCode = ? and deleteFlag = '1'";
		
		Connection conn = JdbcUtils.getMySQlConnection();
		PreparedStatement pstat = conn.prepareStatement(sql);
		
		pstat.setString(1, userCode);
		ResultSet result = pstat.executeQuery();
		
		return JdbcUtils.getHashMap(result);
	}
	
	/**
	 * 根据账号获取用户
	 * 以QueryRunner方式实现
	 */
	public User getUserDemo2(String userCode) throws SQLException {
		String sql = "select * from users where userCode = ? and deleteFlag = '1'";
		return queryRunner.query(sql, new BeanHandler<User>(User.class), new Object[] { userCode });
	}
	
	
}
